#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <errno.h>
#include <string.h>

// realloc函数,对动态开辟的内存调整大小。让动态内存管理更加灵活
// void *realloc(void *ptr, size_t size);

// ptr：要调整的内存地址
// size: 调整之后的新大小
// 返回值为调整之后的内存起始位置
// 这个函数调整原内存空间大小的基础上，还会将原来内存中的数据移动到新的空间，最后返回新开辟的内存空间地址   --  重点

// realloc在调整内存空间时存在两种情况：
//  情况1：ptr指向的空间之后有足够的内存空间可以准假，则直接追加，然后返回p
//  情况2：如果p指向的空间之后没有足够的内存空间可以追加，则realloc函数会重新找一个新的内存区域开辟一块满足需求的空间。
int main()
{
    int *p = realloc(NULL, 40); // 分配40个字节的内存 ，相当于malloc(40)
    if(p == NULL){   // 如果申请失败,输出错误原因
        printf("%s \n", strerror(errno)); // 报错 Not enough space， 10 替换成 INT_MAX，使用INT_MAX 需要引入limits.h
    }

    for (int i = 0; i < 10; i++)
    {
        printf("%d ", p[i]); // 输出乱数， 11671112 11665600 67108868 24290 11671112 11665600 1952671082 1836672092 1830839145 28005
    }
    
    for(int i=0;i<10;i++){
        p[i] = i;           //  这里是赋值
    }
    printf("\n");
    for (int i = 0; i < 10; i++)
    {
        printf("%d ",p[i]); //  输出 0 到 9
    }
    printf("\n");

    // 当动态申请的空间不再使用的时候，就应该还给操作系统
    free(p); // free之后 p仍保留着原来的地址
    p = NULL; // 所以此处将p置为NULL
    return 0;
}